'use strict';

const Op = require('sequelize').Op;
module.exports = () => {
  return async function isLogin(ctx, next) {
    // 排除需要登录接口
    const ignoreArr = [
      '/api/',
      '/api/login',
      '/api/register',
      '/api/registerAdmin',
      // 电商接口白名单
      '/api/shop/register', // 用户注册
      '/api/shop/login', // 用户登录
      '/api/shop/classify', // 商品分类
      // '/api/shop/update', // 上传单张图片
      '/api/shop/goods', // 获取所有商品列表
      '/api/shop/goods/hotGoods', // 获取所有商品列表
      '/api/shop/goods/getById',
      '/api/shop/classify/classifyGoods', // 获取所有商品列表
      '/api/shop/verify', // 获取图片验证码
      '/api/shop/city', // 获取城市列表
      '/api/shop/createLogistics',
      '/api/shop/getSku', // 获取suk信息
      '/api/shop/carousel/getAll', // 获取所有商品轮播图
      '/api/shop/carousel/getById', // 获取单个商品轮播图
      '/api/shop/goodsSearch', // 搜索商品
      // 官网接口白名单
      '/api/web/character/getById',
      '/api/web/character/getAll',
      '/api/web/case/getById',
      '/api/web/case/getAll',
      '/api/web/recruit/getById',
      '/api/web/recruit/getAll',
      '/api/web/classify/getById',
      '/api/web/classify/getAll',
      '/api/web/news/getById',
      '/api/web/news/getAll',
      '/api/web/carouselGroup/getAllCarouselGroup',
      '/api/web/carouselGroup/get',
      '/api/web/carousel/get',
      // 博客接口白名单
      '/api/blog/classify/get',
      '/api/blog/user/register',
      '/api/blog/user/login',
      '/api/blog/user/isRegister',
      '/api/blog/blog/getAllBlog',
      '/api/blog/blog/searchByInput',
      '/api/blog/blog/searchByClassifyId',
    ];
    // const { User } = ctx.app.model.Tables.Shop;
    const nowTime = new Date().getTime();
    // 获取请求接口地址, 参照白名单
    const urlSplit = ctx.url.split('?')[0];

    // 管理台token
    let adminToken = ctx.request.headers['authorization'];
    // 项目用户使用者token
    let userToken = ctx.request.headers['token'];
    // 查找结果
    let result = null;
    // 动态路由白名单
    let regex = /\/(goods|classify)\/(getById|getSoldNum|[1-9]+)/i;

    try {
      // 接口白名单
      if (ignoreArr.includes(urlSplit) || regex.test(urlSplit)) {
        if (adminToken) {
          const { Admin } = ctx.app.model.Tables.Com;
          // console.log('管理员');

          // 获取要操作的用户数据
          result = await Admin.findOne({
            where: {
              token: adminToken,
              token_out_of_date: {
                [Op.gt]: nowTime,
              },
            },
            raw: true,
          });
          ctx.adminInfo = result;

          await next();
        } else {
          await next();
        }
      } else {
        // 管理员token
        if (adminToken) {
          const { Admin } = ctx.app.model.Tables.Com;
          // console.log('管理员');

          // 获取要操作的用户数据
          result = await Admin.findOne({
            where: {
              token: adminToken,
              token_out_of_date: {
                [Op.gt]: nowTime,
              },
            },
            raw: true,
          });
          ctx.adminInfo = result;

          await next();
        }
        // 项目使用者token
        if (userToken) {
          //解密token)
          const tokenInfo = ctx.app.jwt.verify(
            userToken,
            ctx.app.config.jwt.secret
          );
          // 查看是属于哪个项目
          switch (tokenInfo.project_type) {
            case 'shop':
              // console.log('电商项目');
              const ShopUser = ctx.app.model.Tables.Shop.User;
              // 获取要操作的用户数据
              result = await ShopUser.findOne({
                where: {
                  token: userToken,
                  token_out_of_date: {
                    [Op.gt]: nowTime,
                  },
                },
                raw: true,
              });
              break;
            case 'blog':
              // console.log('博客项目');
              const BlogUser = ctx.app.model.Tables.Blog.User;
              // 获取要操作的用户数据
              result = await BlogUser.findOne({
                where: {
                  token: userToken,
                  token_out_of_date: {
                    [Op.gt]: nowTime,
                  },
                },
                raw: true,
              });
              break;
            default:
              console.log('其他项目');
              break;
          }
          ctx.userInfo = result;
          await next();
        }
        if (!result) {
          return ctx.helper.notLogin('token令牌不存在');
        }
      }
    } catch (error) {
      // jwt验证失败
      if (error?.name === 'JsonWebTokenError') {
        return ctx.helper.errorModule('无效token');
      }
      return ctx.helper.errorModule(error);
    }
  };
};
